package cn.anquing.principle.liskovSubstitutionPrinciple;

/**
 * 里氏替换原则:
 * 第二个定义是最清晰明确的，通俗点讲只要父类能出现的地方我子类就可以出现，而且调用子类还不
 产生任何的错误或异常，调用者可能根本就不需要知道是父类还是子类。但是反过来就不成了，有子类出
 现的地方，父类未必就能适应，里氏替换法则包含了四层意思：

 demo1:子类必须完全的实现父类的方法:我们在做系统设计时，经常会定义一个接口或者抽象类，然后编写实现，调用类则直接传入接口或抽象类，其实这里已经使用了里氏替换法则。
 类中调用其他类是务必要使用父类或接口，如果不能使用父类或接口，则说明类的设计已经违背了 LSP 原则。

 demo2:子类可以有自己的个性:子类当然可以有自己的行为和外观了，也就是方法和属性

 demo3:覆盖或实现父类的方法时输入参数可以被放大(重载方法，但不会重写，因为参数不一样，可以认为是不一样的方法)：
 里氏替换法则也要求制定了一个契约，就是父类或接口，这种设计方法也叫做 Design by Contract，契约优先设计，是和里氏替换法则融合在一起的。
 契约制定了，但是契约有前置条件和后置条件，前置条件就是你要让我执行，就必须满足我的条件；后置条件就是我执行完了，必须符合规定的契约
 子类中方法的前置条件必须与超类中被覆盖的方法的前置条件相同或者更宽松。

 demo4:覆盖或实现父类的方法是输出结果可以被缩小（属于重写）
 */


public class Client {


}
